package config

import (
	"encoding/json"
	"flag"
	"os"

	"douhu_backend/internal/log"

	"github.com/pkg/errors"
)

var (
	confPath string
	Conf     = &Config{}
)

type Config struct {
	DB   *DB         `json:"db"`
	Log  *log.Config `json:"log"`
	SMS  *SMS        `json:"sms"`
	JWT  *JWT        `json:"jwt"`
	App  *App        `json:"app"`
	CORS *CORS       `json:"cors"`
}

type DB struct {
	Dbdriver string `json:"dbdriver"`
	Username string `json:"username"`
	Password string `json:"password"`
	Address  string `json:"address"`
	DBName   string `json:"dbName"`
	Options  string `json:"options"`
}

// SMS 短信服务配置
type SMS struct {
	Provider      string            `json:"provider"`
	SecretId      string            `json:"secretId"`
	SecretKey     string            `json:"secretKey"`
	Region        string            `json:"region"`
	AppId         string            `json:"appId"`
	SignName      string            `json:"signName"`
	Templates     map[string]string `json:"templates"`
	ExpireMinutes int               `json:"expireMinutes"`
	DailyLimit    int               `json:"dailyLimit"`
}

// JWT Token配置
type JWT struct {
	SecretKey   string `json:"secretKey"`
	ExpireHours int    `json:"expireHours"`
	Issuer      string `json:"issuer"`
}

// App 应用配置
type App struct {
	Environment string `json:"environment"` // development, production, testing
	Port        int    `json:"port"`
	Debug       bool   `json:"debug"`
}

// CORS 跨域配置
type CORS struct {
	Enabled          bool     `json:"enabled"`
	AllowedOrigins   []string `json:"allowedOrigins"`
	AllowedMethods   []string `json:"allowedMethods"`
	AllowedHeaders   []string `json:"allowedHeaders"`
	AllowCredentials bool     `json:"allowCredentials"`
	MaxAge           int      `json:"maxAge"`
}

func init() {
	flag.StringVar(&confPath, "c", "./config.json", "path to config file")
}

func Init() error {
	// 解析命令行参数
	flag.Parse()

	data, err := os.ReadFile(confPath)
	if err != nil {
		return errors.Wrap(err, "os.ReadFile")
	}

	err = json.Unmarshal(data, Conf)
	if err != nil {
		return errors.Wrap(err, "json.Unmarshal")
	}

	return nil
}
